package juc;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * 任务 串行
 * 多个任务是并行 任务内部是串行
 */
public class CompleteableFutureTest2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //任务一
//        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
//            System.out.println("任务一---电饭煲开始做饭");
//            try {
//                TimeUnit.SECONDS.sleep(3);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            return "任务一返回---白米饭";
//        }).thenAccept(result -> { //消费结果 无返回值
//            System.out.println("任务一收到---result: " + result);
//            System.out.println("任务一---开始吃米饭");
//        });

        //补充：thenApply 处理结果 有返回值
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务一---电饭煲开始做饭");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "任务一返回---白米饭";
        }).thenApply(result -> { //处理结果 有返回值
            System.out.println("任务一收到---result: " + result);
            System.out.println("任务一---开始吃米饭");
            return "任务一---吃完了米饭";
        });


        //任务二
        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务二---我先去搞点牛奶和鸡蛋");
            return "任务二---牛奶和鸡蛋完成";
        });


        /**
         * 获取结果的三种方式
         */

        //一、这样分开join 有先后顺序
//        System.out.println(future2.join());
//        System.out.println(future.join());
//        System.out.println(future2.join());

        //二、拿不到返回值
//        System.out.println(CompletableFuture.allOf(future2, future).join());

        //三、拿到返回值 且有顺序谁在前面谁先拿到返回值
//        Stream.of(future,future2).map(CompletableFuture::join).forEach(System.out::println);
        Stream.of(future2,future).map(CompletableFuture::join).forEach(System.out::println);

    }
}
